package com.thh.create;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.thh.dao.BookDaoImpl;
import com.thh.pojo.Book;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.net.InetAddress;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 演示ES的Document的创建
 */
public class App02_CreateDocument {

    //定义客户端
    TransportClient client;

    /**
     * 批量
     * @throws Exception
     */
    @Test
    public void test4() throws Exception  {

        List<Book> allBooks = new BookDaoImpl().findAllBooks();
        for (Book book : allBooks) {
            //把对象转成json字符串
            ObjectMapper om = new ObjectMapper();
            String bookStr = om.writeValueAsString(book);

            //创建文档
            client.prepareIndex("xiaofeifei_index","book",book.getId()+"")
                    .setSource(bookStr, XContentType.JSON)//添加文档
                    .get();//执行创建
        }
    }

    /*
    文档创建三：JavaBean
     */
    @Test
    public void test3() throws Exception  {
        //创建:   {"id":1,"bookname":"xxxxx","price":56}
        Book book = new Book();
        book.setId(4);
        book.setBookname("lucene in action骚客");
        book.setPic("4.jpg");
        book.setPrice(9000L);
        book.setBookdesc("本书深入浅出地介绍了lucene——一个开源的使用java语言编写的全文搜索引擎开发包。它通过浅显的语言、大量的图注、丰富的代码示例，以及清晰的结构为读者呈现出作为优秀开源项目的lucene所体现的强大功能。全书共10章，分为两大部分。第1部分lucene的核心，着重于lucene的核心 api介绍，并按照把lucene集成到程序中的顺序宋组织；第2部分lucene的应用，通过对lucene内置工具的介绍，展示了lucene技术的高级应用和在各种程序语言上的移植。.");


        //把对象转成json字符串
        ObjectMapper om = new ObjectMapper();
        String bookStr = om.writeValueAsString(book);

        //创建文档
        client.prepareIndex("xiaofeifei_index","book","4")
                .setSource(bookStr, XContentType.JSON)//添加文档
                .get();//执行创建

    }

    /*
    文档创建二：Map
     */
    @Test
    public void test2() throws Exception  {
        //创建json:   {"id":1,"bookname":"xxxxx","price":56}
        Map<String, Object> book = new HashMap<>();
        book.put("id", 3);
        book.put("bookname", "lucene从入门到精通");
        book.put("price", 9600);
        book.put("pic", "3.jpg");
        book.put("bookdesc", "本书总结搜索引擎相关理论与实际解决方案，并给出了 Java 实现，其中利用了流行的开源项目Lucene和Solr，而且还包括原创的实现。本书主要包括总体介绍部分、爬虫部分、自然语言处理部分、全文检索部分以及相关案例分析。爬虫部分介绍了网页遍历方法和如何实现增量抓取，并介绍了从网页等各种格式的文档中提取主要内容的方法。自然语言处理部分从统计机器学习的原理出发，包括了中文分词与词性标注的理论与实现以及在搜索引擎中的实用等细节，同时对文档排重、文本分类、自动聚类、句法分析树、拼写检查等自然语言处理领域的经典问题进行了深入浅出的介绍并总结了实现方法。在全文检索部分，结合Lucene 3.0介绍了搜索引擎的原理与进展。用简单的例子介绍了Lucene的最新应用方法。本书包括完整的搜索实现过程：从完成索引到搜索用户界面的实现。本书还进一步介绍了实现准实时搜索的方法，展示了Solr 1.4版本的用法以及实现分布式搜索服务集群的方法。最后介绍了在地理信息系统领域和户外活动搜索领域的应用。");

        client.prepareIndex("xiaofeifei_index","book","3")
                .setSource(book)//添加文档
                .get();//执行创建

    }

    /*
    文档创建一：
     */
    @Test
    public void test1() throws Exception  {
        //创建json:   {"id":1,"bookname":"xxxxx","price":56}
        XContentBuilder jsonBuilder = XContentFactory.jsonBuilder();
        jsonBuilder
                .startObject()// {
                .field("id",2)
                .field("bookname","java web开发")
                .field("price",7600)
                .field("pic","2.jpg")
                .field("bookdesc","Java Web，是用Java技术来解决相关web互联网领域的技术总和。web包括：web服务器和web客户端两部分。Java在客户端的应用有java applet，不过使用得很少，Java在服务器端的应用非常的丰富，比如Servlet，JSP和第三方框架等等。Java技术对Web领域的发展注入了强大的动力。")
                .endObject() // }
        ;

        client.prepareIndex("xiaofeifei_index","book","2")
                .setSource(jsonBuilder)//添加json文档
                .get();//执行创建

    }



    //初始化
    @Before
    public void init() throws Exception {
        //1、创建一个Settings对象，相当于一个配置信息。主要配置集群的名称。 cluster.name配置集群名称
        Settings settings = Settings.builder().put("cluster.name","elasticsearch").build();
        //2、创建一个客户端client对象。
        client = new PreBuiltTransportClient(settings);
        //3、使用client对象创建一个索引库。
        client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"),9300));
    }

    //释放资源
    @After
    public void close(){
        //4、关闭client对象。
        client.close();
    }
}
